package org.example.javapit;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Classname Test
 * @Description java常见坑
 * @Date 2021/2/9 10:13 上午
 * @Created by xiangjd
 */
public class Test {

    @org.junit.Test
    public void test1() {
        String a = "123";
        String b = null;
        if (Objects.equals(a, b)) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }
    }

    @org.junit.Test
    public void test2() {
        BigDecimal bigDecimal = new BigDecimal("123");
        BigDecimal a = new BigDecimal("1");
        //进行除法一定要保留小数点2位,不然报错
        System.out.println(a.divide(new BigDecimal(3), 2, BigDecimal.ROUND_HALF_UP));
    }


    /**
     * 特殊字符记得转义
     * 结果并不是我们所期待的，java、php、c++。
     * 解决办法我们对|进行转义分割，代码改为 String[] split = str.split("\\|")；结果就正确了。
     * String的split方法需要转义的字符串：. $ | ( ) [ { ^ ? * + \ 共12个特殊字符，遇到以这些字符进行分割字符串的时候，需要在这些特殊字符前加双反斜杠\ \
     *
     * 作者：熬夜不加班
     * 链接：https://juejin.cn/post/6924566386136055816
     * 来源：掘金
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    @org.junit.Test
    public void test3() {
        String str = "java|php|c++";
        String[] split = str.split("\\|");
        for (String s : split) {
            System.out.println(s);
        }
    }

    /**
     *
     */
    @org.junit.Test
    public void  test4(){
        //由于Arrays.ArrayList参数为可变长泛型，而基本类型是无法泛型化的，所以它把int[] array 数组当成了一个泛型对象，
        //所以集合中最终只有一个元素array 。
        int[] array = {1,2,3};
        List list = Arrays.asList(array);
        System.out.println(list.size()); //1


        //是不是也与我们所期待的不一样。修改了数组奥了的值居然影响到了集合里面的值。原因如下：
        //由于asList产生的集合元素是直接引用作为参数的数组，所以当外部数组或集合改变时，数组和集合会同步变化，
        // 这在平时我们编码时可能产生莫名的问题。
        String[] array1 = {"欢","关","java"};
        List list1 = Arrays.asList(array1);
        System.out.println(list1.size());
        array1[0] ="修改数组第一个元素";
        list1.set(2,"修改集合第三个元素");
        System.out.println(Arrays.toString(array1));
        System.out.println(list1.toString());

        //数组转换为集合后，进行增删元素。
        //由于asList产生的集合并没有重写add,remove等方法，所以它会调用父类AbstractList的方法，而父类的方法中抛出的却是异常信息。
        //当我们使用Arrays.asList 产生的集合时候，需要谨慎的去使用。如果需要对集合进行操作的时候我们可以通过 List list = new ArrayList(Arrays.asList(array)); 来进行使用。
        list1.add("java");
        System.out.println(list1.toString());
    }

    /**
     * ConcurrentHashMap的key和value不能为null
     */
    @org.junit.Test
    public void test5(){
        String key = "java";
        Map<String,Object> map = new ConcurrentHashMap<>();
        map.put("1","2");
//        map.put(key,null);// Exception in thread "main" java.lang.NullPointerExceptio
        map.put(null,"123");
    }


    /**
     * 如果String.valueOf里面的值为null,那么会被转换成"null"
     */
    @org.junit.Test
    public void test6(){

        //String.valueOf()

//        这里的 parmMap.get("userName") 如果是 null , 那么这里的 userName就是 “null” ,
//        这是一个值为 null 的字符串。导致数据会拼接到SQL 中，导出出错。为什么会这样我们看下源码就知道了。

//        String  userName= String.valueOf(parmMap.get("userName"));
//        if(StringUtils.isNotBlank(userName)) {
//            sql.append(" and tt.userName like %").append(userName);
//        }

//        public static String valueOf(Object obj) {
//            return (obj == null) ? "null" : obj.toString();
//        }
    }

}
